package com.km.app.util;

import org.im4java.core.*;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ImageTools {

    /**
     * ImageMagick的路径
     */
    public static String imageMagickPath = "C:\\Program Files\\ImageMagick-6.9.2-Q8";
    /**
     * 注明是否是Linux系统
     */
    public static boolean isLinux = false;

    /**
     * 获取ImageMagick的路径 及 判断当前操作系统信息
     */
    static {
        // windows外的默认为Linux
        if (!System.getProperty("os.name").toLowerCase().contains("windows")) {
            isLinux = true;
        }
    }

    public static String getContentType(String filename) throws IOException {
        String type = null;
        Path path = Paths.get(filename);
        type = Files.probeContentType(path);
        return type;
    }

    /**
     * 根据坐标裁剪图片
     *
     * @param srcPath 要裁剪图片的路径
     * @param newPath 裁剪图片后的路径
     * @param x       起始横坐标
     * @param y       起始挫坐标
     * @param x1      结束横坐标
     * @param y1      结束挫坐标
     */
    public static void corpImageByCoordinate(String srcPath, String newPath, Integer x, Integer y,
                                             Integer x1, Integer y1) throws Exception {
        int width = x1 - x;
        int height = y1 - y;
        IMOperation op = new IMOperation();
        op.addImage(srcPath);
        /*
         * width：裁剪的宽度 height：裁剪的高度 x：裁剪的横坐标 y：裁剪的挫坐标
		 */
        op.crop(width, height, x, y);
        // GIF裁剪了在浏览器里识别出来被裁剪的部分会变为透明而不是被剪切掉,以下判断处理此问题
        if (getContentType(srcPath).equals("image/gif")) {
            op.p_repage();
            op.coalesce();
        }
        op.addImage(newPath);
        ConvertCmd convert = new ConvertCmd();
        // linux下不要设置此值，不然会报错
        if (!isLinux) {
            convert.setSearchPath(imageMagickPath);
        }
        convert.run(op);
    }

    /**
     * 根据宽高裁剪图片
     *
     * @param srcPath 要裁剪图片的路径
     * @param newPath 裁剪图片后的路径
     * @param width   图片期待宽度
     * @param height  图片期待高度
     * @param x       起始横坐标
     * @param y       起始挫坐标
     */
    public static void cropImageByWidthAndHeight(String srcPath, String newPath, Integer width, Integer height, Integer x, Integer y) throws Exception {
        IMOperation op = new IMOperation();
        op.addImage(srcPath);
        /*
         * width：裁剪的宽度 height：裁剪的高度 x：裁剪的横坐标 y：裁剪的挫坐标
		 */
        op.crop(width, height, x, y);
        // GIF裁剪了在浏览器里识别出来被裁剪的部分会变为透明而不是被剪切掉,以下判断处理此问题
        if (getContentType(srcPath).equals("image/gif")) {
            op.p_repage();
            op.coalesce();
        }
        op.addImage(newPath);
        ConvertCmd convert = new ConvertCmd();
        // linux下不要设置此值，不然会报错
        if (!isLinux) {
            convert.setSearchPath(imageMagickPath);
        }
        convert.run(op);
    }

    /**
     * 根据尺寸缩放图片
     *
     * @param width   缩放后的图片宽度
     * @param height  缩放后的图片高度
     * @param srcPath 源图片路径
     * @param newPath 缩放后图片的路径
     * @throws java.lang.Exception
     */
    public static void resizeImage(String srcPath, String newPath, Integer width, Integer height) throws Exception {
        IMOperation op = new IMOperation();
        op.addImage(srcPath);
        if (getContentType(srcPath).equals("image/gif")) {
            op.coalesce();
        }
        //op.addRawArgs("-resize",width+"x"+height+"!");
        op.resize(width, height);
        op.addImage(newPath);
        ConvertCmd convert = new ConvertCmd();
        // linux下不要设置此值，不然会报错
        if (!isLinux) {
            convert.setSearchPath(imageMagickPath);
        }
        convert.run(op);
    }

    /**
     * 给图片加水印
     *
     * @param srcPath 源图片路径
     * @param name    水印的内容
     */
    public static void addImgText(String name, String srcPath, String newPath)
            throws Exception {
        IMOperation op = new IMOperation();
        op.font("宋体").gravity("southeast").pointsize(18).fill("#BCBFC8")
                .draw("text 5,5 www.".concat(name));
        op.addImage();
        op.addImage();
        ConvertCmd convert = new ConvertCmd();
        // linux下不要设置此值，不然会报错
        if (!isLinux) {
            convert.setSearchPath(imageMagickPath);
        }
        convert.run(op, srcPath, newPath);
    }
}
